package com.isoft.airportsystem.util;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 通用响应结果封装类
 * @param <T> 数据类型
 */
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 状态码 */
    private Integer code;
    /** 消息 */
    private String message;
    /** 数据 */
    private T data;
    /** 时间戳 */
    private Long timestamp;

    public Result() {
        this.timestamp = System.currentTimeMillis();
    }

    /** 成功响应（无数据） */
    public static <T> Result<T> success() {
        return success((T) null);
    }

    /**
     * 成功响应，带数据（智能处理 null 和 List 类型）
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("操作成功");

        // 智能处理 null 数据，List 类型返回空数组
        if (data == null) {
            if (isListType(data)) {
                result.setData((T) Collections.emptyList());
            } else {
                result.setData(data);
            }
        } else {
            result.setData(data);
        }

        result.setTimestamp(System.currentTimeMillis());
        return result;
    }

    /** 成功响应，带消息和数据 */
    public static <T> Result<T> success(String message, T data) {
        Result<T> result = success(data);
        result.setMessage(message);
        return result;
    }

    /** 失败响应（默认状态码 500） */
    public static <T> Result<T> fail() {
        return fail("操作失败");
    }

    /** 失败响应，带消息 */
    public static <T> Result<T> fail(String message) {
        return fail(500, message);
    }

    /** 失败响应，带状态码和消息 */
    public static <T> Result<T> fail(Integer code, String message) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        result.setData(null);
        result.setTimestamp(System.currentTimeMillis());
        return result;
    }

    // 获取数据类型是否为 List（简化实现）
    private static <T> boolean isListType(T data) {
        return data instanceof List;
    }

    // getter 和 setter
    public Integer getCode() { return code; }
    public void setCode(Integer code) { this.code = code; }
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }
    public T getData() { return data; }
    public void setData(T data) { this.data = data; }
    public Long getTimestamp() { return timestamp; }
    public void setTimestamp(Long timestamp) { this.timestamp = timestamp; }
}